package top.zhangjianyong.tools.indicator.context;

import lombok.Data;
import top.zhangjianyong.tools.entity.ETFData;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 技术指标计算上下文
 * 用于传递K线数据和配置参数
 *
 * @author zhangjianyong
 * @date 2024/01/01
 */
@Data
public class IndicatorContext {

    /**
     * K线数据列表，按时间顺序排列（早到晚）
     */
    private List<ETFData> dataList;

    /**
     * 配置参数，用于传递指标计算所需的参数（如窗口大小、周期等）
     */
    private Map<String, Object> params;

    public IndicatorContext() {
        this.dataList = new ArrayList<>();
        this.params = new HashMap<>();
    }

    public IndicatorContext(List<ETFData> dataList) {
        this.dataList = dataList != null ? dataList : new ArrayList<>();
        this.params = new HashMap<>();
    }

    public IndicatorContext(List<ETFData> dataList, Map<String, Object> params) {
        this.dataList = dataList != null ? dataList : new ArrayList<>();
        this.params = params != null ? params : new HashMap<>();
    }

    /**
     * 获取参数值
     *
     * @param key 参数键
     * @return 参数值
     */
    public Object getParam(String key) {
        return params.get(key);
    }

    /**
     * 获取参数值（带默认值）
     *
     * @param key          参数键
     * @param defaultValue 默认值
     * @return 参数值，如果不存在则返回默认值
     */
    public Object getParam(String key, Object defaultValue) {
        return params.getOrDefault(key, defaultValue);
    }

    /**
     * 获取整数参数
     *
     * @param key          参数键
     * @param defaultValue 默认值
     * @return 整数参数值
     */
    public int getIntParam(String key, int defaultValue) {
        Object value = params.get(key);
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        return defaultValue;
    }

    /**
     * 获取双精度浮点数参数
     *
     * @param key          参数键
     * @param defaultValue 默认值
     * @return 双精度浮点数参数值
     */
    public double getDoubleParam(String key, double defaultValue) {
        Object value = params.get(key);
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        return defaultValue;
    }

    /**
     * 设置参数
     *
     * @param key   参数键
     * @param value 参数值
     */
    public void setParam(String key, Object value) {
        this.params.put(key, value);
    }

    /**
     * 获取数据列表大小
     *
     * @return 数据列表大小
     */
    public int getDataSize() {
        return dataList != null ? dataList.size() : 0;
    }

    /**
     * 检查数据列表是否为空
     *
     * @return true表示数据列表为空
     */
    public boolean isEmpty() {
        return dataList == null || dataList.isEmpty();
    }
}

